/*******************************
    Internal Task Collection
*******************************/

/* These tasks create packaged files from **dist** components
   Not intended to be called directly by a user because
   these do not build fresh from **src**
*/

module.exports = function(gulp) {
  var // node dependencies
    fs = require("fs"),
    chmod = require("gulp-chmod"),
    concat = require("gulp-concat"),
    concatCSS = require("gulp-concat-css"),
    clone = require("gulp-clone"),
    dedupe = require("gulp-dedupe"),
    gulpif = require("gulp-if"),
    header = require("gulp-header"),
    less = require("gulp-less"),
    minifyCSS = require("gulp-clean-css"),
    plumber = require("gulp-plumber"),
    print = require("gulp-print"),
    rename = require("gulp-rename"),
    replace = require("gulp-replace"),
    uglify = require("gulp-uglify"),
    // user config
    config = require("./../config/user"),
    docsConfig = require("./../config/docs"),
    // install config
    tasks = require("./../config/tasks"),
    release = require("./../config/project/release"),
    // shorthand
    globs = config.globs,
    assets = config.paths.assets,
    output = config.paths.output,
    banner = tasks.banner,
    filenames = tasks.filenames,
    log = tasks.log,
    settings = tasks.settings;

  /*--------------
      Packaged
  ---------------*/

  gulp.task("package uncompressed css", function() {
    return gulp
      .src(
        output.uncompressed + "/**/" + globs.components + globs.ignored + ".css"
      )
      .pipe(plumber())
      .pipe(dedupe())
      .pipe(replace(assets.uncompressed, assets.packaged))
      .pipe(concatCSS(filenames.concatenatedCSS, settings.concatCSS))
      .pipe(gulpif(config.hasPermission, chmod(config.permission)))
      .pipe(header(banner, settings.header))
      .pipe(gulp.dest(output.packaged))
      .pipe(print(log.created));
  });

  gulp.task("package compressed css", function() {
    return gulp
      .src(
        output.uncompressed + "/**/" + globs.components + globs.ignored + ".css"
      )
      .pipe(plumber())
      .pipe(dedupe())
      .pipe(replace(assets.uncompressed, assets.packaged))
      .pipe(concatCSS(filenames.concatenatedMinifiedCSS, settings.concatCSS))
      .pipe(gulpif(config.hasPermission, chmod(config.permission)))
      .pipe(minifyCSS(settings.concatMinify))
      .pipe(header(banner, settings.header))
      .pipe(gulp.dest(output.packaged))
      .pipe(print(log.created));
  });

  gulp.task("package uncompressed js", function() {
    return gulp
      .src(
        output.uncompressed + "/**/" + globs.components + globs.ignored + ".js"
      )
      .pipe(plumber())
      .pipe(dedupe())
      .pipe(replace(assets.uncompressed, assets.packaged))
      .pipe(concat(filenames.concatenatedJS))
      .pipe(header(banner, settings.header))
      .pipe(gulpif(config.hasPermission, chmod(config.permission)))
      .pipe(gulp.dest(output.packaged))
      .pipe(print(log.created));
  });

  gulp.task("package compressed js", function() {
    return gulp
      .src(
        output.uncompressed + "/**/" + globs.components + globs.ignored + ".js"
      )
      .pipe(plumber())
      .pipe(dedupe())
      .pipe(replace(assets.uncompressed, assets.packaged))
      .pipe(concat(filenames.concatenatedMinifiedJS))
      .pipe(uglify(settings.concatUglify))
      .pipe(header(banner, settings.header))
      .pipe(gulpif(config.hasPermission, chmod(config.permission)))
      .pipe(gulp.dest(output.packaged))
      .pipe(print(log.created));
  });

  /*--------------
        RTL
  ---------------*/

  if (config.rtl) {
    gulp.task("package uncompressed rtl css", function() {
      return gulp
        .src(
          output.uncompressed +
            "/**/" +
            globs.components +
            globs.ignoredRTL +
            ".rtl.css"
        )
        .pipe(dedupe())
        .pipe(replace(assets.uncompressed, assets.packaged))
        .pipe(concatCSS(filenames.concatenatedRTLCSS, settings.concatCSS))
        .pipe(gulpif(config.hasPermission, chmod(config.permission)))
        .pipe(header(banner, settings.header))
        .pipe(gulp.dest(output.packaged))
        .pipe(print(log.created));
    });

    gulp.task("package compressed rtl css", function() {
      return gulp
        .src(
          output.uncompressed +
            "/**/" +
            globs.components +
            globs.ignoredRTL +
            ".rtl.css"
        )
        .pipe(dedupe())
        .pipe(replace(assets.uncompressed, assets.packaged))
        .pipe(
          concatCSS(filenames.concatenatedMinifiedRTLCSS, settings.concatCSS)
        )
        .pipe(gulpif(config.hasPermission, chmod(config.permission)))
        .pipe(minifyCSS(settings.concatMinify))
        .pipe(header(banner, settings.header))
        .pipe(gulp.dest(output.packaged))
        .pipe(print(log.created));
    });

    gulp.task("package uncompressed docs css", function() {
      return gulp
        .src(
          output.uncompressed +
            "/**/" +
            globs.components +
            globs.ignored +
            ".css"
        )
        .pipe(dedupe())
        .pipe(plumber())
        .pipe(replace(assets.uncompressed, assets.packaged))
        .pipe(concatCSS(filenames.concatenatedCSS, settings.concatCSS))
        .pipe(gulpif(config.hasPermission, chmod(config.permission)))
        .pipe(gulp.dest(output.packaged))
        .pipe(print(log.created));
    });

    gulp.task("package compressed docs css", function() {
      return gulp
        .src(
          output.uncompressed +
            "/**/" +
            globs.components +
            globs.ignored +
            ".css"
        )
        .pipe(dedupe())
        .pipe(plumber())
        .pipe(replace(assets.uncompressed, assets.packaged))
        .pipe(concatCSS(filenames.concatenatedMinifiedCSS, settings.concatCSS))
        .pipe(minifyCSS(settings.concatMinify))
        .pipe(header(banner, settings.header))
        .pipe(gulpif(config.hasPermission, chmod(config.permission)))
        .pipe(gulp.dest(output.packaged))
        .pipe(print(log.created));
    });
  }

  /*--------------
        Docs
  ---------------*/

  var docsOutput = docsConfig.paths.output;

  gulp.task("package uncompressed docs css", function() {
    return gulp
      .src(
        docsOutput.uncompressed +
          "/**/" +
          globs.components +
          globs.ignored +
          ".css"
      )
      .pipe(dedupe())
      .pipe(plumber())
      .pipe(replace(assets.uncompressed, assets.packaged))
      .pipe(concatCSS(filenames.concatenatedCSS, settings.concatCSS))
      .pipe(gulpif(config.hasPermission, chmod(config.permission)))
      .pipe(gulp.dest(docsOutput.packaged))
      .pipe(print(log.created));
  });

  gulp.task("package compressed docs css", function() {
    return gulp
      .src(
        docsOutput.uncompressed +
          "/**/" +
          globs.components +
          globs.ignored +
          ".css"
      )
      .pipe(dedupe())
      .pipe(plumber())
      .pipe(replace(assets.uncompressed, assets.packaged))
      .pipe(concatCSS(filenames.concatenatedMinifiedCSS, settings.concatCSS))
      .pipe(minifyCSS(settings.concatMinify))
      .pipe(header(banner, settings.header))
      .pipe(gulpif(config.hasPermission, chmod(config.permission)))
      .pipe(gulp.dest(docsOutput.packaged))
      .pipe(print(log.created));
  });

  gulp.task("package uncompressed docs js", function() {
    return gulp
      .src(
        docsOutput.uncompressed +
          "/**/" +
          globs.components +
          globs.ignored +
          ".js"
      )
      .pipe(dedupe())
      .pipe(plumber())
      .pipe(replace(assets.uncompressed, assets.packaged))
      .pipe(concat(filenames.concatenatedJS))
      .pipe(header(banner, settings.header))
      .pipe(gulpif(config.hasPermission, chmod(config.permission)))
      .pipe(gulp.dest(docsOutput.packaged))
      .pipe(print(log.created));
  });

  gulp.task("package compressed docs js", function() {
    return gulp
      .src(
        docsOutput.uncompressed +
          "/**/" +
          globs.components +
          globs.ignored +
          ".js"
      )
      .pipe(dedupe())
      .pipe(plumber())
      .pipe(replace(assets.uncompressed, assets.packaged))
      .pipe(concat(filenames.concatenatedMinifiedJS))
      .pipe(uglify(settings.concatUglify))
      .pipe(header(banner, settings.header))
      .pipe(gulpif(config.hasPermission, chmod(config.permission)))
      .pipe(gulp.dest(docsOutput.packaged))
      .pipe(print(log.created));
  });
};
